#include <iostream>
using namespace std;

// 拷贝构造函数调用时机

class Person
{
public:
    int age;
    
    Person()
    {
        cout << "Person 默认构造函数调用" << endl;
    }

    Person(int Age)
    {
        age = Age;
        cout << "Person 有参构造函数调用" << endl;
    }

    Person(const Person& p)
    {
        age = p.age;
        cout << "Person 拷贝构造函数调用" << endl;
    }

    ~Person()
    {
        cout << "Person 析构函数调用" << endl;
    }
};

//1、使用一个已经创建完毕的对象，来初始化一个新对象
void test1()
{
    Person p1(20);
    Person p2(p1);// 拷贝构造
    Person p3 = p1;

    cout << "p2年龄为：" << p2.age << endl;
    cout << "p3年龄为：" << p3.age << endl;
}


// 2、值传递的方式给函数参数传值
void doWork(Person p) // 调用拷贝构造函数
{
}

void test2()
{
    Person p;
    doWork(p);// 根据实参p，利用拷贝构造，创建了一个形参
}


//3、值方式返回局部对象

Person doWork2()
{
    Person p1;
    return p1;
}
void test3()
{
    Person p2 = doWork2();// 相当于拷贝构造，p1与p2不是同一个对象
}

int main()
{
    test1();
    cout << "---------------" << endl;
    
    test2();
    cout << "---------------" << endl;

    test3();
    cout << "---------------" << endl;
    
    return 0;
}